﻿namespace WorldmeServer.Utils
{
    public class PaginationUtils
    {
        /// <summary>
        /// 对 IQueryable<T> 进行分页，并返回分页后的 List<T>。
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="source">数据源</param>
        /// <param name="pageNumber">页码（从 1 开始）</param>
        /// <param name="pageSize">每页大小</param>
        /// <returns>分页后的 List<T></returns>
        public static List<T> Paginate<T>(IQueryable<T> source, int pageNumber, int pageSize)
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));

            if (pageNumber < 1)
                throw new ArgumentException("页码必须大于等于 1", nameof(pageNumber));

            if (pageSize < 1)
                throw new ArgumentException("每页大小必须大于等于 1", nameof(pageSize));

            // 计算跳过的记录数
            int skip = (pageNumber - 1) * pageSize;

            // 在数据库层面分页
            return source.Skip(skip).Take(pageSize).ToList();
        }

        /// <summary>
        /// 对 IQueryable<T> 进行分页，并返回分页后的数据以及分页信息。
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="source">数据源</param>
        /// <param name="pageNumber">页码（从 1 开始）</param>
        /// <param name="pageSize">每页大小</param>
        /// <returns>包含分页数据和分页信息的对象</returns>
        public static PagedResult<T> PaginateWithInfo<T>(IQueryable<T> source, int pageNumber, int pageSize)
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));

            if (pageNumber < 1)
                throw new ArgumentException("页码必须大于等于 1", nameof(pageNumber));

            if (pageSize < 1)
                throw new ArgumentException("每页大小必须大于等于 1", nameof(pageSize));

            // 计算总记录数
            int totalCount = source.Count();

            // 计算跳过的记录数
            int skip = (pageNumber - 1) * pageSize;

            // 在数据库层面分页
            var data = source.Skip(skip).Take(pageSize).ToList();

            // 计算总页数
            int totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);

            // 返回分页结果
            return new PagedResult<T>
            {
                Data = data,
                PageNumber = pageNumber,
                PageSize = pageSize,
                TotalCount = totalCount,
                TotalPages = totalPages
            };
        }
    }

    /// <summary>
    /// 分页结果对象
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    public class PagedResult<T>
    {
        /// <summary>
        /// 分页数据
        /// </summary>
        public List<T> Data { get; set; }

        /// <summary>
        /// 当前页码
        /// </summary>
        public int PageNumber { get; set; }

        /// <summary>
        /// 每页大小
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 总记录数
        /// </summary>
        public int TotalCount { get; set; }

        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPages { get; set; }
    }
}
